package com.whut.imservice.constant;

import java.util.Arrays;

/**
 * @Description: WebSocket消息类型枚举
 * @Author: Zonghe Wang
 * @Date: 2025/5/24 21:58
 */
public enum MessageTypeEnum {
    /**
     * 心跳检测（客户端→服务端）
     * 数据格式: {"type":0,"data":{"uid":123,"timeout":30000}}
     */
    HEARTBEAT(0),

    /**
     * 用户登录（客户端→服务端）
     * 数据格式: {"type":1,"data":{"uid":123}}
     */
    LOGIN(1),

    /**
     * 查询会话消息（客户端→服务端）
     * 数据格式: {"type":2,"data":{"ownerUid":123,"otherUid":456}}
     */
    QUERY_MESSAGES(2),

    /**
     * 发送消息（客户端→服务端）
     * 数据格式: {"type":3,"data":{"senderUid":123,"recipientUid":456,"content":"hello"}}
     */
    SEND_MESSAGE(3),

    /**
     * 查询总未读数（客户端→服务端）
     * 数据格式: {"type":5,"data":{"uid":123}}
     */
    QUERY_UNREAD(5),

    /**
     * 消息确认（客户端→服务端）
     * 数据格式: {"type":6,"data":{"tid":789}}
     */
    ACK(6),

    /**
     * 错误响应（服务端→客户端）
     * 数据格式: {"type":99,"data":{"error":"Invalid message format"}}
     */
    ERROR(99);

    private final int code;

    MessageTypeEnum(int code) {
        this.code = code;
    }

    /**
     * 根据消息类型码获取枚举实例
     * @param code 消息类型码
     * @return 对应的枚举实例
     * @throws IllegalArgumentException 当收到未知类型码时抛出
     */
    public static MessageTypeEnum fromCode(int code) {
        return Arrays.stream(values())
                .filter(t -> t.code == code)
                .findFirst()
                .orElseThrow(() -> new IllegalArgumentException("无效的消息类型码: " + code));
    }

    /**
     * 获取消息类型码
     * @return 类型对应的数字编码
     */
    public int getCode() {
        return code;
    }

    /**
     * 检查是否为有效消息类型
     * @param code 待检查的类型码
     * @return true表示有效，false表示无效
     */
    public static boolean isValidType(int code) {
        return Arrays.stream(values()).anyMatch(t -> t.code == code);
    }

    /**
     * 获取所有有效类型码
     * @return 包含所有有效类型码的数组
     */
    public static int[] validCodes() {
        return Arrays.stream(values()).mapToInt(MessageTypeEnum::getCode).toArray();
    }
}
